package org.ailuoli.guard.api;

import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.ConstraintViolation;
import jakarta.validation.ConstraintViolationException;
import jakarta.validation.ValidationException;
import lombok.extern.slf4j.Slf4j;
//import org.ailuoli.am.common.entity.base.TipsLevelEnum;
//import org.ailuoli.am.common.i18n.MessageSourceHelper;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.HttpMediaTypeNotSupportedException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.servlet.NoHandlerFoundException;
import org.tools.bedrock.exception.BusinessException;
import org.tools.bedrock.http.resp.RR;
import org.tools.bedrock.http.resp.v2.R;

import java.util.Objects;
import java.util.Optional;
import java.util.Set;

//import static org.ailuoli.am.common.i18n.MessageKeyEnum.*;

/**
 * <p>
 * description
 * </p>
 *
 * @author sander 2024/06/27
 */
@Slf4j
@ResponseBody
@ControllerAdvice
@Order(0)
public class GlobalExceptionHandler {

//    @Resource
//    protected MessageSourceHelper messageSourceHelper;
//
//    /**
//     * 缺少请求参数
//     */
//    @ResponseStatus(HttpStatus.BAD_REQUEST)
//    @ExceptionHandler(MissingServletRequestParameterException.class)
//    public RR handleMissingServletRequestParameterException(MissingServletRequestParameterException e) {
//        log.error("缺少请求参数：", e);
//        String errorMessage = messageSourceHelper.getMessage(MISSING_REQUEST_PARAMETERS.getMessageKey());
//        return R.build(TipsLevelEnum.ERROR_LEVEL, errorMessage);
//    }
//
//    /**
//     * 参数解析错误
//     */
//    @ResponseStatus(HttpStatus.BAD_REQUEST)
//    @ExceptionHandler(HttpMessageNotReadableException.class)
//    public RR handleHttpMessageNotReadableException(HttpMessageNotReadableException e) {
//        log.error("参数解析失败：", e);
//        String errorMessage = messageSourceHelper.getMessage(MESSAGE_NOT_READABLE.getMessageKey());
//        return R.build(TipsLevelEnum.ERROR_LEVEL, errorMessage);
//    }
//
//    /**
//     * 参数验证失败
//     */
//    @ResponseStatus(HttpStatus.BAD_REQUEST)
//    @ExceptionHandler(MethodArgumentNotValidException.class)
//    public RR handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
//        BindingResult result = e.getBindingResult();
//        FieldError error = result.getFieldError();
//        String field = Objects.requireNonNull(error).getField();
//        String code = error.getDefaultMessage();
//        String message = String.format("%s:%s", field, code);
//        String errorMessage = "参数验证失败:" + message;
//        log.error(errorMessage, e);
//        return R.build(TipsLevelEnum.WARNING_LEVEL, errorMessage);
//    }
//
//    /**
//     * 参数绑定异常
//     */
//    @ResponseStatus(HttpStatus.BAD_REQUEST)
//    @ExceptionHandler(BindException.class)
//    public RR handleBindException(BindException e) {
//        BindingResult result = e.getBindingResult();
//        FieldError error = result.getFieldError();
//        String field = Objects.requireNonNull(error).getField();
//        String code = error.getDefaultMessage();
//        String message = String.format("%s:%s", field, code);
//        log.error("参数绑定异常:" + message, e);
//        String errorMessage = messageSourceHelper.getMessage(PARAM_BIND_EXCEPTION.getMessageKey());
//        return R.build(TipsLevelEnum.ERROR_LEVEL, errorMessage);
//    }
//
//
//    /**
//     * 约束冲突异常
//     */
//    @ResponseStatus(HttpStatus.BAD_REQUEST)
//    @ExceptionHandler(ConstraintViolationException.class)
//    public RR handleConstraintViolationException(ConstraintViolationException e) {
//        Set<ConstraintViolation<?>> violations = e.getConstraintViolations();
//        ConstraintViolation<?> violation = violations.iterator().next();
//        String message = violation.getMessage();
//        log.error("参数约束冲突异常：" + message, e);
//        String errorMessage = messageSourceHelper.getMessage(CONSTRAINT_VIOLATION_EXCEPTION.getMessageKey());
//        return R.build(TipsLevelEnum.ERROR_LEVEL, errorMessage);
//    }
//
//    /**
//     * 参数验证异常
//     */
//    @ResponseStatus(HttpStatus.BAD_REQUEST)
//    @ExceptionHandler(ValidationException.class)
//    public RR handleValidationException(ValidationException e) {
//        log.error("参数验证失败:", e);
//        String errorMessage = messageSourceHelper.getMessage(VALIDATION_EXCEPTION.getMessageKey());
//        return R.build(TipsLevelEnum.ERROR_LEVEL, errorMessage);
//    }
//
//    /**
//     * 请求未找到
//     */
//    @ResponseStatus(HttpStatus.NOT_FOUND)
//    @ExceptionHandler(NoHandlerFoundException.class)
//    public RR noHandlerFoundException(NoHandlerFoundException e) {
//        log.error("未找到请求:", e);
//        String errorMessage = messageSourceHelper.getMessage(NOT_FOUND_EXCEPTION.getMessageKey(), new Object[]{e.getRequestURL()});
//        return R.build(TipsLevelEnum.ERROR_LEVEL, errorMessage);
//    }
//
//
//    /**
//     * 不支持请求方法
//     */
//    @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
//    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
//    public RR handleHttpRequestMethodNotSupportedException(HttpServletRequest request, HttpRequestMethodNotSupportedException e) {
//        String url = request != null ? request.getRequestURL().toString() : null;
//        log.error("不支持请求方法,url:{},method:{},仅支持:{}", url, e.getMethod(), e.getSupportedHttpMethods());
//        String errorMessage = messageSourceHelper.getMessage(METHOD_NOT_ALLOWED.getMessageKey(), new Object[]{e.getMethod()});
//        return R.build(TipsLevelEnum.ERROR_LEVEL, errorMessage);
//    }
//
//    /**
//     * 415 不支持的媒体类型
//     */
//    @ResponseStatus(HttpStatus.UNSUPPORTED_MEDIA_TYPE)
//    @ExceptionHandler(HttpMediaTypeNotSupportedException.class)
//    public RR handleHttpMediaTypeNotSupportedException(HttpMediaTypeNotSupportedException e) {
//        log.error("不支持媒体类型:", e);
//        String errorMessage = messageSourceHelper.getMessage(INTERNAL_SERVER_ERROR.getMessageKey());
//        return R.build(TipsLevelEnum.WARNING_LEVEL, errorMessage);
//    }
//
//    /**
//     * 业务层需要自己声明异常的情况
//     */
//    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
//    @ExceptionHandler(BusinessException.class)
//    public RR handleServiceException(BusinessException e) {
//        log.info("BusinessException异常统一拦截:{}", e.getMessage());
//        String i18nMessage = messageSourceHelper.getMessage(e.getMessage());
//        String defaultMessage = Optional.ofNullable(i18nMessage).orElse(e.getMessage());
//        return R.build(TipsLevelEnum.REMIND_LEVEL, defaultMessage);
//    }
//
//    /**
//     * 处理参数异常，参数异常需要声明的异常情况
//     *
//     * @param e 异常
//     * @return {@link R}<?>
//     */
//    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
//    @ExceptionHandler(IllegalArgumentException.class)
//    public RR handleArgumentException(IllegalArgumentException e) {
//        log.error("参数异常:", e);
//        String i18nMessage = messageSourceHelper.getMessage(e.getMessage());
//        String defaultMessage = Optional.ofNullable(i18nMessage).orElse(e.getMessage());
//        return R.build(TipsLevelEnum.REMIND_LEVEL, defaultMessage);
//    }
//
//    /**
//     * 内部服务器异常
//     */
//    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
//    @ExceptionHandler(value = Exception.class)
//    public RR defaultErrorHandler(Exception e) {
//        log.error("内部服务器错误:", e);
//        String errorMessage = messageSourceHelper.getMessage(INTERNAL_SERVER_ERROR.getMessageKey());
//        return R.build(TipsLevelEnum.ERROR_LEVEL, errorMessage);
//    }

}
